package cn.lili.modules.payment.kit.plugin.alipay;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.SpringContextUtil;
import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.payment.AlipayPaymentSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import com.alipay.api.AlipayApiException;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;

import java.util.Date;

/**
 * AliPayApiConfigKit
 *
 * @author Chopper
 * @since 2020-12-16 09:31
 */
public class AliPayApiConfigKit {

	/**
	 * 支付配置
	 */
	static DefaultAlipayClient defaultAlipayClient;

	/**
	 * 下次刷新时间
	 */
	static Date nextRebuildDate;

	/**
	 * 间隔时间
	 */
	static Long refreshInterval = 1000 * 60 * 3L;

	/**
	 * 获取支付宝支付参数
	 *
	 * @return
	 * @throws AlipayApiException
	 */
	public static synchronized DefaultAlipayClient getAliPayApiConfig() throws AlipayApiException {
		Date date = new Date();
		// 如果过期，则重新构建
		if (nextRebuildDate == null || date.after(nextRebuildDate)) {
			return rebuild();
		}
		return defaultAlipayClient;
	}

	static DefaultAlipayClient rebuild() throws AlipayApiException {
		AlipayPaymentSetting setting;
		try {
			SettingService settingService = (SettingService) SpringContextUtil.getBean("settingServiceImpl");
			Setting systemSetting = settingService.get(SettingEnum.ALIPAY_PAYMENT.name());
			setting = JSONUtil.toBean(systemSetting.getSettingValue(), AlipayPaymentSetting.class);
		} catch (Exception e) {
			throw new ServiceException(ResultCode.PAY_NOT_SUPPORT);
		}
		CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
		certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
		certAlipayRequest.setFormat("json");
		certAlipayRequest.setCharset("utf-8");
		certAlipayRequest.setSignType("RSA2");
		certAlipayRequest.setAppId(setting.getAppId());
		certAlipayRequest.setPrivateKey(setting.getPrivateKey());
		certAlipayRequest.setCertPath(setting.getCertPath());
		certAlipayRequest.setAlipayPublicCertPath(setting.getAlipayPublicCertPath());
		certAlipayRequest.setRootCertPath(setting.getRootCertPath());
		defaultAlipayClient = new DefaultAlipayClient(certAlipayRequest);
		nextRebuildDate = DateUtil.date(System.currentTimeMillis() + refreshInterval);
		return defaultAlipayClient;
	}
}
